/*
*******************************************************************************
* 表单常规动作工具集(需要Hongs-CORE-js的支持)
*
* Author: Huang Hong
* Support: kevin.hongs@gmail.com, +8613718308220
*
* Usage:

var FA = new HsFormAction("formId", true);
// 设置校验规则
FC.checkAction({
  0           : function(){},       // 提交时校验
  "username"  : [noEmpty, hasName], // 必填校验
  "email"     : [noCheck, isEmail], // 选填校验
  "ids[]"     : [noEmpty]           // 复选项校验
});

*
* Event:

onReset() 在重置表单动作时发生(返回行为同form的onreset)
onBack()  在表单提交成功后发生(返回true阻止标准back动作)
onFail()  在表单提交失败后发生

*
* Style:

.form_error     // 表单项错误消息
.form_right     // 表单项正确消息

*******************************************************************************
*/

function HsFormAction(formObj, useFW) {
  var _this = this;

  _this.formObj = formObj;
  _this.useFW = useFW; 

  _this.msgExt = self.formMsgExt;
  _this.boxExt = self.formBoxExt;
  _this.rightClass = self.formRightClass;
  _this.errorClass = self.formErrorClass;
  _this.errorBoxClass = _this.errorClass + "_box";

  _this.tabIndex = self.formTabIndex;       // 设置焦点顺序, 为0则不设置
  _this.tabFocus = self.formTabFocus;       // 设置焦点位置, 为0则不设置
  _this.checkType = self.formCheckType;     // 校验方式: 0为提交时校验, 1为数据改变时校验, 2为失去焦点时校验, 3为实时校验
  _this.submitType = self.formSubmitType;   // 提交方式: 0为利用AJAX提交, 1为利用IFRAME提交
  _this.submittingMsg = self.submittingMsg; // 提交过程消息: 点击提交后到服务器返回前的消息
  _this.resultMsgType = self.resultMsgType; // 返回消息方式: 0发出失败消息, 1发出成功消息, 2发出所有消息, 3不发出任何消息

  // 以下设置true或1发出正确消息, -1发出默认消息
  _this.noCheckReturn = self.formNoCheckReturn; // 选填正确返回值
  _this.noEmptyReturn = self.formNoEmptyReturn; // 必填正确返回值
  _this.rightReturn = self.formRightReturn;     // 正确返回值

  _this.keepOn = false;    // 提交成功后继续操作
  _this.autoClose = true;  // 提交成功后自动关闭(浮动窗状态)
  _this.backAction = "";   // 提交成功后跳转的URL(非浮动窗状态)
  _this.backData = null;   // 提交后返回的数据

  _this.checkOrders = [];  // 表单校验集合
  _this.checkFields = {};  // 表单项校验结果
  _this.checkOldMsgs = {}; // 表单校验原始消息
  //afa扩展
  _this.loadingType = true; // 是否要提交浮动层
  _this.init = function() {
    if (!_this.formObj) {
      return;
    }

    if (typeof _this.formObj == "string") {
      _this.formName  = _this.formObj;
      _this.formObj   = document.forms[_this.formName];
    }
    else {
      _this.formObj   = _this.formObj;
      _this.formName  = _this.formObj.getAttributeNode("name").nodeValue;
    }

    if (!_this.formObj) {
      hsError(self.formActionNoFromErr, "FormAction");
    }

    // 关闭事件
    _this.checkOnClose();

    // 提交事件
    _this.checkOnSubmit(null);

    // 重置事件
    new HsEventListener(_this.formObj, 'reset', _this.onReset);
  };

  _this.checkAction = function(ca) {
    if (typeof ca == "function") {
      _this.checkOnSubmit(ca);
      return;
    }

    var i = _this.tabIndex;
    var is = 0, ix = 0;
    var cas = {}, cax = {};

    for (var n in ca) {
      if (typeof ca[n] == "function") {
        _this.checkOnSubmit(ca[n]);
        continue;
      }

      var nv = _this.element(n);
      if (nv == null) {
        if (ca[n][0] == noEmpty) {
          hsError(self.formActionNoElementErr, "FormAction", "Element is " + n);
        }
        continue;
      }

      if (nv.value && ca[n][0] == noEmpty) {
        _this.checkFields[n] = true;
      }

      if (_this.tabIndex > 0 && nv.tabIndex == null) {
        nv.tabIndex = i;
      }

      if (_this.tabFocus > 0 && _this.tabFocus == i) {
        try {
          nv.focus();
        }
        catch (ex) {
        }
        self.HsFE = nv;
      }

      if (_this.checkType && (nv.length == undefined || nv.tagName == "SELECT")) {
        cax[n] = ca[n];
        ix ++;
      }
      else {
        cas[n] = ca[n];
        is ++;
      }

      i ++;
    }

    if (is > 0) {
      _this.checkOnSubmit(cas);
    }
    if (ix > 0) {
      _this.checkOnChange(cax, _this.checkType);
    }
  };

  // 检查关闭事件
  _this.checkOnClose = function() {
    if (_this.useFW == false) {
      return;
    }

    if (self.HsFW == null) {
      setTimeout(_this.checkOnClose, 500);
      return;
    }

    HsFW.onClose = function() {
      if (!_this.keepOn) {
        return;
      }
      if (_this.autoClose) {
        HsFW.close();
      }
      if (!_this.onBack()) {
        HsOW.location.reload();
      }
    };
  };

  // 提交时验证(当ca是数组是己进行单个表单项逐一验证, 为函数则调用该函数来验证整个表单)
  _this.checkOnSubmit = function(ca) {
    if (ca) {
      // 校验规则入栈
      _this.checkOrders.push(ca);
    }

    // 提交初始化
    if (!_this.submitInited) {
      if (!_this.submitType) {
        _this.checkFrame();
      }

      _this.submitInited = true;

      /** 绑定事件 **/

      new HsEventListener(
        _this.formObj,
        'submit',
        function(ev) {
          var rv = true;

          for (var i = 0; i < _this.checkOrders.length; i ++) {
            var ca = _this.checkOrders[i];
            if (typeof ca == "function") {
              // 整体校验
              rv = ca(_this.formObj);
            }
            else {
              // 单项校验
              for (var n in ca) {
                if (!_this.element(n)) {
                  continue;
                }

                // 执行校验过程
                if (_this.checkOne(n, ca[n]) === false) {
                  rv = false;
                }
              }
            }
          }
          /** 提交 **/

          if (rv == false || _this.actionSubmit() == false) {
            if (ev.preventDefault) {
              ev.preventDefault();
            }
            else {
              ev.returnValue = false;
            }
            return false;
          }
          else {
            return true;
          }
        }
      );
    }
  };

  // 检查辅助iframe
  _this.checkFrame = function() {
    _this.frameName = _this.formName + "_f";
    _this.frameObj = hsId(_this.frameName);

    if (!_this.frameObj) {
      _this.frameObj = document.createElement("iframe");
      _this.frameObj.id = _this.frameName;
      _this.frameObj.name = _this.frameName;
      _this.frameObj.width = 0;
      _this.frameObj.height = 0;
      _this.frameObj.frameborder = 0;
      _this.frameObj.style.display = "none";

      _this.formObj.parentNode.insertBefore(_this.frameObj, _this.formObj);
      _this.formObj.setAttribute("target", _this.frameName);

      // 针对IE的IFRAME不能直接写NAME的问题
      window.frames[_this.frameName].name = _this.frameName;
    }

    if (HsBI.name == "MSIE") { // For IE
      _this.frameObj.onreadystatechange = _this.actionBack;
    }
    else {
      _this.frameObj.onload = _this.actionBack;
    }
  };

  // 数据改变时时验证(ca是表单项验证策略的数组)
  _this.checkOnChange = function(ca, type) {
    switch (type) {
      case 3: type = "time"; break;
      case 2: type = "blur"; break;
      default: type = "change"; break;
    }

    for (var n in ca) {
      if (!_this.element(n)) {
        continue;
      }

      /** 绑定事件 **/

      if (type == "time") {
        new HsEventListener(
          _this.element(n),
          "blur",
          function() {
            if (_this.timeHandle) {
              clearInterval(_this.timeHandle);
            }
          }
        );

        var chkEvent = new HsEventListener(
          _this.element(n),
          "focus",
          function(e, me) {
            // 定时检查
            _this.timeHandle = setInterval(
              function() {
                var nv = _this.element(me.n);
                var nvType = nv.type.toUpperCase();
                var nvValue = null;

                if (nvType == "CHECKBOX" || nvType == "RADIO") {
                  nvValue = nv.checked;
                }
                else if (nv.tagName == "SELECT") {
                  nvValue = nv.selectedIndex;
                }
                else {
                  nvValue = nv.value;
                }

                if (_this.timeValue != nvValue) {
                  _this.timeValue = nvValue;
                  _this.checkOne(me.n, me.ca);
                }
              },
              1000
            );
          }
        );

        chkEvent.n = n;
        chkEvent.ca = ca[n];
        delete chkEvent;
      }
      else {
        var chkEvent = new HsEventListener(
          _this.element(n),
          type,
          function(e, me) {
            _this.checkOne(me.n, me.ca);
          }
        );

        chkEvent.n = n;
        chkEvent.ca = ca[n];
        delete chkEvent;
      }
    }

    _this.checkOnSubmit(ca);
  };

  // 失去焦点时验证(ca是表单项验证策略的数组)
  _this.checkOnBlur = function(ca) {
    _this.checkOnChange(ca, 2);
  };

  // 实时验证(ca是表单项验证策略的数组)
  _this.checkOnTime = function(ca) {
    _this.checkOnChange(ca, 3);
  };

  _this.checkOne = function(n, ca) {
    if (!ca) {
      for (var i = 0; i < _this.checkOrders.length; i ++) {
        ca = _this.checkOrders[i];
        if (typeof ca == "function") {
          continue;
        }
        if (typeof ca[n] == "undefined") {
          continue;
        }
        if (_this.checkOne(n, ca[n]) === false) {
          return false;
        }
      }
      return true;
    }

    var nv = _this.element(n);

    // 检验 Checkbox, Radio, Select
    var nvType = nv.type.toUpperCase();
    if (nvType == "CHECKBOX" || nvType == "RADIO" || nv.tagName == "SELECT") {
      return _this.checkOnx(n, ca, nv);
    }
    delete nvType;

    var v = nv.value.trim();
    var c, m;
    if (typeof(ca[0]) == "object") {
      c = ca[0][0];
      m = ca[0][1];
    }
    else {
      c = ca[0];
      m = null;
    }

    // 占位
    if (c == noCheck) {
      _this.checkMsg(n, _this.noCheckReturn, 1 < ca.length ? true : false);
    }
    // 是否非空
    else if (c == noEmpty) {
      if (0 < v.length) {
        _this.checkMsg(n, _this.noEmptyReturn, 1 < ca.length ? true : false);
      }
      else if (_this.checkMsg(n, m ? m : self.noEmptyMsg, false) == false) {
        return false;
      }
    }
    // 默认可空
    else {
      if (0 == v.length) {
        return _this.checkMsg(n, _this.noCheckReturn);
      }
    }

    // 应用校验器
    var i = c == noCheck || c == noEmpty ? 1 : 0;
    for (; i < ca.length; i ++) {
      if (typeof(ca[i]) == "object") {
        c = ca[i][0];
        m = ca[i][1];
      }
      else {
        c = ca[i];
        m = null;
      }

      var r = c(v, n);
      var rt = i < ca.length - 1 ? true : false;

      if (r === true) {
        _this.checkMsg(n, r, rt);
      }
      else {
        return _this.checkMsg(n, m ? m : r, rt);
      }
    }

    // 检查长度(扩展功能)
    if (v.length > 0) {
      var il = nv.getAttribute("minlength");
      /*******2010-11-30 修改者  安鑫 判断长度用字符判断,之前是用直接判断的     开始*******/
      if (il && v.length < parseInt(il)) {
        return _this.checkMsg(n, self.isMinLengthMsg1.replace("%n", il));
      }
      var al = nv.getAttribute("maxlength");
      if (al && v.length > parseInt(al)) {
        return _this.checkMsg(n, self.isMaxLengthMsg1.replace("%n", al));
      }
      /*if (il && v.getBytes() < parseInt(il)) {
        return _this.checkMsg(n, self.isMinLengthMsg.replace("%n", il));
      }
      var al = nv.getAttribute("maxlength");
      if (al && v.getBytes() > parseInt(al)) {
        return _this.checkMsg(n, self.isMaxLengthMsg.replace("%n", al));
      }*/
      /*******2010-11-30 修改者  安鑫     结束*******/
    }

    return true;
  };

  _this.checkOnx = function(n, ca, nv) {
    var isSlelect = nv.tagName == "SELECT" ? true : false;
    if (isSlelect) {
      nv = nv.options;
    }
    else if (nv.length == undefined) {
      nv = [nv];
    }

    var j = 0;
    for (; j < nv.length; j ++) {
      if (isSlelect) {
        if (nv[j].selected == true && nv[j].value != "") {
          break;
        }
      }
      else {
        if (nv[j].checked == true && nv[j].value != "") {
          break;
        }
      }
    }

    var c, m;
    if (typeof(ca[0]) == "object") {
      c = ca[0][0];
      m = ca[0][1];
    }
    else {
      c = ca[0];
      m = null;
    }

    // 占位
    if (c == noCheck) {
      _this.checkMsg(n, _this.noCheckReturn, 1 < ca.length ? true : false);
    }
    // 是否非空
    else if (c == noEmpty) {
      if (j < nv.length) {
        _this.checkMsg(n, _this.noEmptyReturn, 1 < ca.length ? true : false);
      }
      else if (_this.checkMsg(n, m ? m : self.noEmpty2Msg, false) == false) {
        return false;
      }
    }
    // 默认可空
    else {
      if (j == nv.length) {
        return _this.checkMsg(n, _this.noCheckReturn);
      }
    }

    // 应用校验器(如果有)
    var i = c == noCheck || c == noEmpty ? 1 : 0;
    for (; i < ca.length; i ++) {
      if (typeof(ca[i]) == "object") {
        c = ca[i][0];
        m = ca[i][1];
      }
      else {
        c = ca[i];
        m = null;
      }

      var r = c(null, n);
      var rt = i < ca.length - 1 ? true : false;

      if (r === true) {
        _this.checkMsg(n, r, rt);
      }
      else {
        return _this.checkMsg(n, m ? m : r, rt);
      }
    }

    return true;
  };

  _this.checkMsg = function(n, r, rt) {
    if ((r === -1 || r === 1 || r === true) && rt == true) {
      return true;
    }

    var msgHTML;
    var msgNode = hsId(n + _this.msgExt);

    if (msgNode && _this.checkOldMsgs[n] == undefined) {
      _this.checkOldMsgs[n] = msgNode.innerHTML;
    }

    if (r === 1 || r === true) {
      r = _this.rightReturn;
    }

    /** 需要不同表现形式请修改这里 **/

    // 标准效果
    if (r === 0) {
      // If you want do nothing, return 0
      return _this.checkFields[n];
    }
    else if (r === -1) {
      _this.checkFields[n] = true;
      msgHTML = _this.checkOldMsgs[n];
    }
    else if (r === 1 || r === true) {
      _this.checkFields[n] = true;
      msgHTML = '<span class="'+_this.rightClass+'">&radic;</span>';
    }
    else {
      _this.checkFields[n] = false;
      msgHTML = '<span class="'+_this.errorClass+'">&times; '+r+'</span>';
    }

    // 标准消息
    if (msgNode) {
      msgNode.innerHTML = msgHTML;
    }
    else if(_this.checkFields[n] === false) {
      alert(r);
    }

    // 附加特效
    var boxNode = hsId(n + _this.boxExt);
    if (!boxNode && _this.element(n)) {
      boxNode = _this.element(n);
    }
    if (boxNode) {
      if (r === 0 || r === -1 || r === 1 || r === true) {
        //boxNode.className = boxNode.className.replace(" "+_this.errorBoxClass, "");
        //boxNode.className = boxNode.className.replace(_this.errorBoxClass+" ", "");
        if(boxNode.className){
            boxNode.className = boxNode.className.replace(_this.errorBoxClass, "");
        }
      }
      else {
        if (boxNode.className) {
          if (boxNode.className.indexOf(_this.errorBoxClass) == -1) {
            boxNode.className += " "+_this.errorBoxClass;
          }
        }
        else {
          boxNode.className = _this.errorBoxClass;
        }
      }
    }

    return _this.checkFields[n];
  };

  // 根据名字取对象
  _this.element = function(n) {
    var nv = _this.formObj.elements[n];
    if (nv && nv.type == undefined && nv.length != undefined) {
      // Is checkbox or radio
      nv.type = nv[0].type;
    }
    return nv;
  };

  // 手工提交(需要提供一个提交按钮)
  _this.submit = function(n) {
    _this.element(n?n:"submit").click();
  };

  // 手工重置(需要提供一个重置按钮)
  _this.reset = function(n) {
    document.location.href = document.location.href;
    //_this.element(n?n:"reset").click();
  };

  // 提交函数
  _this.actionSubmit = function() {
    if(_this.loadingType){
      _this.submitting = new HsPW.HsFloatLoading(_this.submittingMsg);
      _this.submitting.start();
    }
    if (_this.submitType) {
      new HsAjaxRequest(
        _this.actionBack2,
        _this.formObj.method,
        _this.formObj.action,
        _this.formObj.elements,
        _this.submitType == 1 ? true : false
      );
      return false;
    }
    else {
      _this.action = _this.formObj.action;
      if (_this.formObj.action.indexOf("?") == -1) {
        _this.formObj.action += "?in_ajax=1";
      }
      else {
        _this.formObj.action += "&in_ajax=1";
      }
      return true;
    }
  };

  // 回调函数(IFrame形式)
  _this.actionBack = function() {
    var frame = hsId(_this.frameName);
    if (frame.readyState != null && frame.readyState != "complete") {
      return;
    }

    if (!_this.submitting) {
      return;
    }

    _this.submitting.stop();
    _this.submitting = null;

    _this.formObj.action = _this.action;

    var text = window.frames[_this.frameName].document.body;
    if (typeof text.textContent != "undefined") {
      text = text.textContent; // Firefox Bug
    }
    else {
      text = text.innerHTML;
    }

    var result = hsAjaxRequestResult(text, _this.resultMsgType);
    if (result == null) {
      return;
    }

    _this.backData = result;
    _this.actionBackOK(result.__result);
  };

  // 回调函数(AJAX形式)
  _this.actionBack2 = function(rst) {
    if (!_this.submitting) {
      return;
    }

    _this.submitting.stop();
    _this.submitting = null;

    var result = hsAjaxRequestResult(rst, _this.resultMsgType);
    if (result == null) {
      return;
    }

    _this.backData = result;
    _this.actionBackOK(result.__result);
  };

  // 回调后续处理函数
  _this.actionBackOK = function(isOK) {
    self.hasElementLast = {};
    if (isOK) {
      var ko = _this.element("keep_on");
      if (ko) {
        _this.keepOn = ko.checked;
      }

      if (_this.keepOn) {
        _this.reset();
        if (ko) {
          ko.checked =  true;
        }
        return;
      }

      if (_this.useFW) {
        if (_this.autoClose) {
          HsFW.close();
        }
        if (!_this.onBack()) {
          HsOW.location.reload();
        }
      }
      else {
        if (!_this.onBack() && _this.backAction) {
          location.href = _this.backAction;
        }
      }
    }
    else {
      _this.onFail();
    }
  };

  /** 伪事件 **/

  // 重置事件(默认可以重置)
  _this.onReset = function() {
    return true;
  };

  // 返回事件(仅成功后执行)
  _this.onBack = function() {
    return false;
  };

  // 失败事件
  _this.onFail = function() {
  };

  /** 对象初始化 **/

  _this.init();
}

// 不检查(占位)
function noCheck() {
  return true;
}
// 是否为域名
function isDomain(str) {
  if (! /^([a-z0-9\-_]+\.){0,6}[a-z0-9\-_]+\.[a-z0-9\-_]+$/.test(str)) {
    return "不正确的域名格式";
  }
  return true;
}
// 不能为空
function noEmpty(str) {
  if (str.trim().length == 0) {
    return noEmptyMsg;
  }
  return true;
}

// 必须是数字
function isNum(str) {
  if (! /^\d+$/.test(str)) {
    return isNumMsg;
  }
  return true;
}

// 必须是整数
function isInt(str) {
  if (! /^-?\d+$/.test(str)) {
    return isIntMsg;
  }
  return true;
}

// 必须为整数(无符号)
function isIntUnsigned(str) {
  if (! /^\d+$/.test(str)) {
    return isIntUnMsg;
  }
  return true;
}

// 必须为正整数
function isIntRight(str) {
  if (! /^[0-9]+$/.test(str) || str == 0) {
    return "只能输入正整数";
  }
  return true;
}

// 必须是浮点数
function isFloat(str) {
  if (! /^-?\d+(\.\d+)?$/.test(str)) {
    return isFloatMsg;
  }
  return true;
}

// 必须是浮点数(无符号)
function isFloatUnsigned(str) {
  if (! /^\d+(\.\d+)?$/.test(str)) {
    return isFloatUnMsg;
  }
  return true;
}

//必须是数(整数,小数,负数)
function isNumberAll(str){
	if (! /^[-]?[0-9]+([.]{1}[0-9]+){0,1}$/.test(str) || str == 0) {
	    return "只能输入数字";
	  }
	  return true;
}
// 是否是字母
function isAlpha(str) {
  if (! /^[a-z]+$/i.test(str)) {
    return isAlphaMsg;
  }
  return true;
}

// 是否是字母或数字
function isAlphaNum(str) {
  if (! /^[a-z0-9_-]+$/i.test(str)) {
    return isAlphaNumMsg;
  }
  return true;
}

// 是否为URL
function isUrl(str) {
  if (! /^((http(s)?|ftp|telnet|news|rtsp|mms):\/\/)?(((\w(\-*\w)*\.)+[a-zA-Z]{2,4})|(((1\d\d|2([0-4]\d|5[0-5])|[1-9]\d|\d).){3}(1\d\d|2([0-4]\d|5[0-5])|[1-9]\d|\d).?))(:\d{0,5})?(\/+.*)*$/.test(str)) {
    return isUrlMsg;
  }
  return true;
}

// 是否为URL
function isURLs (str) {
  if (! /^((http(s)?|ftp|telnet|news|rtsp|mms):\/\/)(((\w(\-*\w)*\.)+[a-zA-Z]{2,4})|(((1\d\d|2([0-4]\d|5[0-5])|[1-9]\d|\d).){3}(1\d\d|2([0-4]\d|5[0-5])|[1-9]\d|\d).?))(:\d{0,5})?(\/+.*)*$/.test(str)) {
    return isUrlMsg;
  }
  return true;
}

// 是否为邮箱
function isEmail(str) {
  if (! /^[^@\s]+@[^@\s]+$/.test(str)) {
    return isEmailMsg;
  }
  return true;
}

// 是否是IP
function isIp(str) {
  if (isIpv4(str) === true) {
    return true;
  }
  return isIpMsg;
}

// 是否是IPv4
function isIpv4(str) {
  if (! /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test(str)) {
    return isIpv4Msg;
  }
  return true;
}

/** 附加校验器(请将附加的校验器放在这里, 不要到处乱加) **/

// 是否是电话号码
function isTel(str) {
  if (isPhone(str) === true) {
    return true;
  }
  if (isMobile(str) === true) {
    return true;
  }
  return isTelMsg;
}

// 是否是座机
function isPhone(str) {
  if (/^(\+?\d{2,4}-?)?(\d{3,4}-?)?\d{7,8}$/.test(str)) {
    return true;
  }
  return isPhoneMsg;
}

// 是否是手机
function isMobile(str) {
  if (/^(1[35][0-9]|188|189)\d{8}$/.test(str)) {
    return true;
  }
  return isMobileMsg;
}

// 只能输入正整数和小数，小数最多精确到小数点后两位
 function isNumFloat(str){
    var userreg=/^[0-9]+([.]{1}[0-9]{1,2})?$/;
    if(/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(str)){
      return true;
    }
    return "只能输入正整数或小数[精确到小数点后两位]";
 }
//必须是整数
 function isPositiveNumber(str){
 	if (! /^[0-9]+([.]{1}[0-9]+){0,1}$/.test(str) || str == 0) {
 	    return "只能输入正数";
 	  }
 	  return true;
 }
/** 辅助校验器(请将辅助的校验器放在这里, 不要到处乱加) **/

//验证FTP地址
function isFtpPath(str){
    //var string = str.substring(1,str.lastIndexOf('/'));
    var string = str.substring(0,1);
    if(string == "/"){
        return true;
    }
    return isFtpPathMsg;
}

// 是否小于
function isMin(str, min) {
  var num = hsParseFloat(str);
  if (num < min) {
    return isMinMsg.replace("%n", min);
  }
  return true;
}

// 是否大于
function isMax(str, max) {
  var num = hsParseFloat(str);
  if (num > max) {
    return isMaxMsg.replace("%n", max);
  }
  return true;
}

// 是否重复
function isRepeat(str, str2) {
  if (str != str2) {
    return isRepeatMsg;
  }
  return true;
}

// 是否为QQ或者MSN
function isQQORMSN (str) {
    if (/^\w+@hotmail\.com$/.test(str) || /^\s*[.0-9]{5,10}\s*$/.test(str)) {
        return true;
    } else {
        return "不是正确的QQ或MSN格式";
    }
}

// 是否为邮箱 （多个邮箱用；号分割） 也可以判断单个邮箱
function isEmails(str) {
    var arr = str.split(";");
    if (arr.constructor == window.Array) {
        for(var i=0; i < arr.length; i ++) {
            if (! /^[^@\s]+@[^@\s]+$/.test(arr[i])) {
                return "不是正确的Email格式";
            }
        }
    } else {
            if (! /^[^@\s]+@[^@\s]+$/.test(arr[i])) {
                return "不是正确的Email格式";
            }
    }
    return true;
}

// 是否已存在
function hasElement(element, action) {
  if (!self.hasElementLast) {
    self.hasElementLast = {};
  }
  else if (self.hasElementLast[element.name]
  && self.hasElementLast[element.name]['value'] == element.value) {
    return self.hasElementLast[element.name]['return'];
  }

  if (action.indexOf("?") < 0) {
    action += "?";
  }
  else {
    action += "&";
  }
  action += "n="+encodeURI(element.name)+"&v="+encodeURIComponent(element.value);
  action += "&"+encodeURI(element.name)+"="+encodeURIComponent(element.value); // 兼容旧的模式

  var rsp = hsAjaxRequestGet(action); // 发送同步请求
  var ret;
  if (rsp == null) {
    ret = false;
  }
  else if (rsp.responseText == "OK") {
    ret = true;
  }
  else if (rsp.responseText == "HAS_IT" || rsp.responseText == "") {
    ret = hasElementMsg;
  }
  else {
    ret = rsp.responseText;
  }

  self.hasElementLast[element.name] = {
    'value'   : element.value,
    'return'  : ret
  };

  return ret;
}


// 是否已存在
function checkElement(element, action) {
  if (!self.hasElementLast) {
    self.hasElementLast = {};
  }

  if (action.indexOf("?") < 0) {
    action += "?";
  }
  else {
    action += "&";
  }
  action += "n="+encodeURI(element.name)+"&v="+encodeURIComponent(element.value);
  action += "&"+encodeURI(element.name)+"="+encodeURIComponent(element.value); // 兼容旧的模式

  var rsp = hsAjaxRequestGet(action); // 发送同步请求
  var ret;
  if (rsp == null) {
    ret = false;
  }
  else if (rsp.responseText == "OK") {
    ret = true;
  }
  else if (rsp.responseText == "HAS_IT" || rsp.responseText == "") {
    ret = hasElementMsg;
  }
  else {
    ret = rsp.responseText;
  }

  self.hasElementLast[element.name] = {
    'value'   : element.value,
    'return'  : ret
  };

  return ret;
}
